package com.sharkpro.service.impl;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.sharkpro.service.UtilsService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.OutputStream;

/**
 * @author jianxin.wei
 * @description
 * @date 2024/12/30 17:15
 */
@Service
public class UtilsServiceImpl implements UtilsService {
    @Override
    public void base64ToImage(JSONObject jsonObject, HttpServletResponse response) throws IOException {
        String base64Data = jsonObject.getStr("base64Data");
        if (StrUtil.isBlank(base64Data)) {
            // 如果 Base64 数据为空，返回错误信息
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            response.getWriter().write("Base64 数据为空");
            return;
        }
        // 解码 Base64 数据为字节数组
        byte[] imageBytes = Base64.decode(base64Data);

        // 获取图片的本身格式
        String imageType = getImageType(imageBytes);

        // 设置响应的内容类型为图片（这里假设是 PNG 格式）
        response.setContentType(imageType);
        response.setContentLength(imageBytes.length);

        // 将字节数组写入响应的输出流
        try (OutputStream out = response.getOutputStream()) {
            out.write(imageBytes);
            out.flush();
        } catch (IOException e) {
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write("处理图片时发生错误,请检查输入的Base64编码是否正确完整。");
        }
    }
    /**
     * 获取图片格式
     */
    private String getImageType(byte[] imageBytes) {
        if (imageBytes == null || imageBytes.length < 4) {
            return null;
        }

        // 判断 PNG 格式
        if (imageBytes[0] == (byte) 0x89 && imageBytes[1] == (byte) 0x50 &&
                imageBytes[2] == (byte) 0x4E && imageBytes[3] == (byte) 0x47) {
            return "image/png";
        }

        // 判断 GIF 格式
        if (imageBytes[0] == (byte) 0x47 && imageBytes[1] == (byte) 0x49 &&
                imageBytes[2] == (byte) 0x46 && (imageBytes[3] == (byte) 0x38)) {
            return "image/gif";
        }

        // 判断 JPEG 格式
        if (imageBytes[0] == (byte) 0xFF && imageBytes[1] == (byte) 0xD8 &&
                imageBytes[2] == (byte) 0xFF) {
            return "image/jpeg";
        }

        return null;  // 未识别的格式
    }
}
